类型: dijkstra
Problem Description
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
Input
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。
Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
Sample Input
2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0
Sample Output
3
2
题解:
此题解包括dijkstra的讲解。
**dijistra的简述:**将源点(初始点)放入一个空集合U,初始化距离(指图中的任意一点距离源点最短的距离)为0,由源点开始广度遍历,寻找到离源点最近的相邻点后加入U中,从这个点V继续广度遍历,对于每个相邻的点P,对比已知距离和由当前点V加V、P两点间边的权值,取最小后更新,在这些相邻的点中取离源点最近的点,加入集合U中,重复操作,直到U的大小等于图的点的集合。
题目简述: 简单的最短路。
代码:
include <iostream>
include <cstring>
include <vector>
include <queue>
using namespace std;
const int INF = 0x3f3f3f3f;
struct Edge {
int vertex, weight;
};
class Graph {
private:
int n;
vector<Edge> * edges;
bool * visited;
public:
int * dist;
Graph (int input_n) {
n = input_n;
edges = new vector<Edge>[n];
dist = new int[n];
visited = new bool[n];
memset(visited, 0, n);
memset(dist, 0x3f, n * sizeof(int));
}
~Graph() {
delete[] dist;
delete[] edges;
delete[] visited;
}
void insert(int x, int y, int weight) {
edges[x].push_back(Edge{y, weight});
edges[y].push_back(Edge{x, weight});
}
void dijkstra(int v) {
dist[v] = 0;
for(int i = 0;i < n;i++){
int min_dist = INF,min_vertex;
for(int j = 0;j < n; j++){
if(!visited[j] && dist[j] < min_dist){
min_dist = dist[j];
min_vertex = j;
}
}
visited[min_vertex] = 1;
for(Edge &j: edges[min_vertex]){
if( min_dist + j.weight < dist[j.vertex]){
dist[j.vertex] = min_dist + j.weight;
}
}
}
}
};
int main() {
int n, m;
while ((cin >> n >> m) && n && m){
Graph g(n);
for (int i = 0; i < m; i++) {
int a, b, c;
cin >> a >> b >> c;
g.insert(a-1, b-1, c);
}
g.dijkstra(0);
cout << g.dist[n-1] << endl;
}
return 0;
}